﻿using System;
using System.Diagnostics.CodeAnalysis;
using System.Windows.Controls;
using Pfz.DataTypes;
using Pfz.Factoring;

namespace Pfz.WpfControls.ValueControls
{
	/// <summary>
	/// Control used to edit Times without dates.
	/// </summary>
	[SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")]
	[AutoRegisterInControlFactory(typeof(Time))]
	[AutoRegisterInControlFactory(typeof(Time?))]
	internal sealed class TimeControl:
		UserControl,
		IValueControl
	{
		private ComboBox _comboHour = new ComboBox { Width = 50 };
		private ComboBox _comboMinute = new ComboBox { Width = 50 };
		private ComboBox _comboSecond = new ComboBox { Width = 50 };
		
		/// <summary>
		/// Creates a new TimeControl.
		/// </summary>
		public TimeControl()
		{
			var stackPanel = new StackPanel();
			stackPanel.Orientation = Orientation.Horizontal;
			
			var gridChildren = stackPanel.Children;
			gridChildren.Add(_comboHour);
			gridChildren.Add(_comboMinute);
			gridChildren.Add(_comboSecond);
			
			_AddValues(_comboHour, 24);
			_AddValues(_comboMinute, 60);
			_AddValues(_comboSecond, 60);
			
			Content = stackPanel;
		}

		private static void _AddValues(ComboBox combo, int count)
		{
			var items = combo.Items;
			for (int i=0; i<count; i++)
				items.Add(i);
		}
	
		/// <summary>
		/// Clears the value of this control.
		/// </summary>
		public void Clear()
		{
			_comboHour.SelectedIndex = 0;
			_comboMinute.SelectedIndex = 0;
			_comboSecond.SelectedIndex = 0;
		}

		/// <summary>
		/// Gets or sets a value indicating if this control is read-only.
		/// </summary>
		public bool IsReadOnly
		{
			get
			{
				return !_comboHour.IsEnabled;
			}
			set
			{
				_comboHour.IsEnabled = !value;
				_comboMinute.IsEnabled = !value;
				_comboSecond.IsEnabled = !value;
			}
		}

		/// <summary>
		/// Gets or sets the value of this control.
		/// </summary>
		public Time? Value
		{
			get
			{
				var hour = _comboHour.SelectedValue;
				
				if (hour == null || hour.Equals(""))
					return null;
				
				return new Time(Convert.ToInt32(hour), _comboMinute.SelectedIndex, _comboSecond.SelectedIndex, 0);
			}
			set
			{
				if (value == null || value.Value == default(Time))
				{
					Clear();
					return;
				}
				
				var time = value.Value;
				_comboHour.SelectedValue = time.Hour;
				_comboMinute.SelectedIndex = time.Minute;
				_comboSecond.SelectedIndex = time.Second;
			}
		}
		
		#region IValueContainer Members
			object IValueContainer.Value
			{
				get
				{
					return Value;
				}
				set
				{
					Value = (Time?)value;
				}
			}
		#endregion
	}
}
